package fr.auzaiphe.commun.reseau;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * Classe Thread ecoutant perpetuellement l'arrivée des paquets du serveur.
 * Elle exécute ensuite l'instruction envoyé par la paquet
 * ATTENTION L'APPEL DU OPEN DU CONSTRUCTEUR NIQUE TOUT (JOJO ON A BESOIN DE WAT)
 * @author Jojo
 */
public class ReseauChatReceiver extends Thread
{
	private boolean run;                        // Execution du thread sur true, interuption sur false
	private Socket socket;                      // Socket de reception
	private ReseauClient client;                // Classe maitresse du reseau
	private ObjectInputStream streamIn;         // flux de lecture pour les paquets
	private ReseauPacketHandler packetHandler;  // Gestionnaire de paquet

	/**
	 * Constructeur
	 * @param _client
	 * @param _socket
	 */
	public ReseauChatReceiver( ReseauClient pClient, Socket pSocket, ReseauPacketHandler pPacketHandler )
	{
		super();
		this.client = pClient;
		this.socket = pSocket;
		this.packetHandler = pPacketHandler;
		this.open();
		this.run = true;
	}

	/**
	 * Ouverture du DataInputStream pour la lecture des messages venant du serveur.
	 */
	public void open()
	{
		try
		{
			this.streamIn = new ObjectInputStream( this.socket.getInputStream() );
		}
		catch (IOException ioe)
		{
			System.out.println("Error getting input stream: " + ioe);
			this.client.stop();
		}
	}

	/**
	 * Fermeture du DataInputStream de lecture des messages venant du serveur.
	 */
	public void close()
	{
		try
		{
			if (this.streamIn != null) this.streamIn.close();
		}
		catch (IOException ioe)
		{
			System.out.println("Error closing input stream: " + ioe);
		}
	}

	/**
	 * Moteur de reception et d'execution des de l'action dans les paquets
	 */
	@Override
	public void run()
	{
		while ( this.run )
		{
			try
			{
				this.packetHandler.action( ( Packet ) this.streamIn.readObject() );
			}
			catch (IOException ioe)
			{

				System.out.println("Listening error: " );
				ioe.printStackTrace();
				this.client.stop();
			}
			catch (ClassNotFoundException e)
			{
				e.printStackTrace();
			}
		}
	}

	/**
	 * Interruption du thread
	 */
	@Override
	public void interrupt()
	{
		super.interrupt();
		this.run = false;
	}
}